﻿/**********************************************************
 ●项目：Smartkernel
 ●公司：智能核心信息技术研发中心
 ●作者：曹艳白
 ●邮箱：caoyanbai@gmail.com
 ●创建：2008-08-10
**********************************************************/
using System;
using System.Runtime.CompilerServices;
using System.Threading;

namespace Smartkernel
{
    /// <summary>
    /// 智能线程：提供线程操作的相关功能，包括多线程、异步调用等
    /// </summary>
    public static class SmartThread
    {
        /// <summary>
        /// 异步方法调用，BS架构不支持这种方式的异步调用。
        /// </summary>
        /// <param name="action">需要被异步执行的方法，方法必须无返回值无参数</param>
        public static void AsynchronousMethodInvoke(Action action)
        {
            action.BeginInvoke(null, null);
        }
        /// <summary>
        /// 多线程方法调用，此多线程是通过线程池实现，所以一般适用于执行时间
        /// 短的方法。BS架构中可以使用这个方法实现异步操作。
        /// </summary>
        /// <param name="action">需要被异步执行的方法，方法必须无返回值无参数</param>
        public static void MultithreadingMethodInvoke(Action action)
        {
            //对传入的方法进行包装，使其符合线程池的参数要求
            WaitCallback waitCallback = delegate(object state)
            {
                action.Invoke();
            };

            ThreadPool.QueueUserWorkItem(waitCallback);
        }
        /// <summary>
        /// 线程安全的方法调用，保证方法同一个时间只能有一个线程调用
        /// </summary>
        /// <param name="action">需要被异步执行的方法，方法必须无返回值无参数</param>
        [MethodImpl(MethodImplOptions.Synchronized)]
        public static void SynchronizedMethodInvoke(Action action)
        {
            action.Invoke();
        }
        /// <summary>
        /// 静态构造函数
        /// </summary>
        static SmartThread()
        {
            //设置线程池中的辅助线程和I/O线程数量。下面的设置是默认值的2倍。默认设置是25，1000。
            //ThreadPool.SetMaxThreads(50, 2000);
        }
        /// <summary>
        /// 阻塞当前线程
        /// </summary>
        /// <param name="timeout">阻塞时间</param>
        public static void Sleep(TimeSpan timeout)
        {
            Thread.Sleep(timeout);
        }
    }
}
